iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

協定

Swift中的協定使用protocol關鍵字來建立,其中可以宣告屬性與方法,其中屬性在具體實現時可以是計算屬性,也可以是儲存屬性。

protocol ProtocolNew {
    // 定義實例屬性
    // 可讀的
    var name:String{get}
    // 可讀可寫的
    var age:Int {get set}
    var nameAndAge: String{get}
    // 定義靜態屬性
    static var className:String{get}
}
// 建立一個類來遵守協定
class ClassNew:ProtocolNew {
    // 進行協定中屬性的實現
    var name:String
    var age: Int
    var nameAndAge: String{
        get{
            return "\(name) + \(age)"
        }
    }
    static var className: String{
        get{
            return "MyClass"
        }
    }
    init(){
        name = "andy"
        age = 23
    }

}

需要注意的是,當協定中約定的屬性是可讀時,並非只讀的意思,他在實現中可以是只讀的,也可以是可讀可寫的,如果協定中約定的屬性為可讀可寫,則在實現時其必須是可讀可寫的。

// 定義一個協定
protocol ProtocolNewTwo {
    // 宣告實例方法
    func logName()
    // 宣告靜態方法
    static func logClassName()
}
// 遵守協定進行實現
class ClassNewTwo: ProtocolNewTwo {
    var name:String
    var age: Int
    init(){
        name = "andy"
        age = 23
    }
    func logName() {
        print(name)
    }
    static func logClassName() {
        print("ClassNewTwo")
    }
    
}

協定中雖然沒有任何屬性和方法的實現,但在很多應用場景中,其在語法上和普通資料型態有著相似的結構。

protocol MyProtocol {
    // 定義實例屬性
    var name:String{get}
    var age:Int {get set}
    var nameAndAge: String{get}
    
    static var className:String{get}
    func logName()
    static func logClassName()
}
// 將協定類型作為參數
func test(param: MyProtocol) {
    param.logName()
}

協定也可以作為某一個集合的元素類型,其意義是集合中所有的元素都要遵守此協定。

var array:Array<MyProtocol>

協定和class擁有相同的繼承語法。

// 定義一個協定
protocol ProtocolNewTwo {
    // 宣告實例方法
    func logName()
    // 宣告靜態方法
    static func logClassName()
}
protocol  SubProtocol: ProtocolNewTwo {
    // 此協定自動繼承協定中的約定方法
}

協定可以被class、struct等遵守,如果開發者需要使某個協定只能被class遵守,可以用class關鍵字來修飾。

protocol  ClassProtocol: class {
    // 此協定只能被class遵守
}

由於協定可以繼承,因此協定也可以使用is as! 等關鍵字進行檢查與轉換。

接下來,是Any與AnyObject的介紹


上一篇
Day26 Swift 擴展
下一篇
Day28 Any與AnyObject
系列文
初入Swift新手村的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言